﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using SistemaGO_Library.Entidades.Cancelamento;
using SistemaGO_Library.Entidades.Categoria;
using SistemaGO_Library.Entidades.Mudanca;
using SistemaGO_Library.Entidades.Ocorrencia;
using SistemaGO_Library.Entidades.Pedido;
using SistemaGO_Library.Entidades.Proposta;
using SistemaGO_Library.Entidades.Terceiro;
using SistemaGO_Library.Entidades.Usuario;

namespace SistemaGO_Library
{
    public class Fachada
    {
        private static Fachada instancia = null;
                
        private CadastroCancelamento cancelamentos;
        private CadastroCategoria categorias;
        private CadastroMudanca mudancas;
        private CadastroOcorrencia ocorrencias;
        private CadastroPedido pedidos;
        private CadastroProposta propostas;
        private CadastroTerceiro terceiros;
        private CadastroUsuario usuarios;
        private Usuario usuario;

        public Usuario Usuario
        {
            get { return usuario; }
            set { usuario = value; }
        }
        
        private void initCadastros() {
            IRepositorioCancelamento repositorioCancelamentos = new RepositorioCancelamento();
            cancelamentos = new CadastroCancelamento(repositorioCancelamentos);
            
            IRepositorioCategoria repositorioCategorias = new RepositorioCategoria();
            categorias = new CadastroCategoria(repositorioCategorias);
            
            IRepositorioMudanca repositorioMudancas = new RepositorioMudanca();
            mudancas = new CadastroMudanca(repositorioMudancas);
            
            IRepositorioOcorrencia repositorioOcorrencias = new RepositorioOcorrencia();
            ocorrencias = new CadastroOcorrencia(repositorioOcorrencias);
            
            IRepositorioPedido repositorioPedidos = new RepositorioPedido();
            pedidos = new CadastroPedido(repositorioPedidos);
            
            IRepositorioProposta repositorioPropostas = new RepositorioProposta();
            propostas = new CadastroProposta(repositorioPropostas);
            
            IRepositorioTerceiro repositorioTerceiros = new RepositorioTerceiro();
            terceiros = new CadastroTerceiro(repositorioTerceiros);
            
            IRepositorioUsuario repositorioUsuarios = new RepositorioUsuario();
            usuarios = new CadastroUsuario(repositorioUsuarios);
        }

        private Fachada() {
            initCadastros();
        }

        public static Fachada getInstance() {
            if (instancia == null) instancia = new Fachada();
            return instancia;
        }

        //Métodos Cancelamentos
        public void inserirCancelamento(Cancelamento can) {
            cancelamentos.inserirCancelamento(can);
        }

        public Cancelamento buscarCancelamento(int cod) {
            Cancelamento can = new Cancelamento();
            can = cancelamentos.buscarCancelamento(cod);
            return can;
        }

        public void alterarCancelamento(int cod, Cancelamento novoCancelamento) {
            cancelamentos.alterarCancelamento(cod, novoCancelamento);
        }

        public void excluirCancelamento(int cod) {
            cancelamentos.excluirCancelamento(cod);
        }

        //Métodos Categorias
        public void inserirCategoria(Categoria cat) {
            categorias.inserirCategoria(cat);
        }

        public Categoria buscarCategoria(int cod) {
            Categoria cat = new Categoria();
            cat = categorias.buscarCategoria(cod);
            return cat;
        }

        public void alterarCategoria(int cod, Categoria novaCategoria) {
            categorias.alterarCategoria(cod, novaCategoria);
        }

        public void excluirCategoria(int cod) {
            categorias.excluirCategoria(cod);
        }

        public int buscarCodigoCategoria() {
            return categorias.buscarCodigoCategoria();
        }

        public string[] buscarNomesCategorias() {
            return categorias.buscarNomesCategorias();
        }

        public int buscarCodigoCategoriaPorNome(string categoria) {
            return categorias.buscarCodigoCategoriaPorNome(categoria);
        }

        //Métodos Mudanças
        public void inserirMudanca(Mudanca mud) {
            mudancas.inserirMudanca(mud);
        }

        public Mudanca buscarMudanca(int cod) {
            Mudanca mud = new Mudanca();
            mud = mudancas.buscarMudanca(cod);
            return mud;
        }

        public void alterarMudanca(int cod, Mudanca novaMudanca) {
             mudancas.alterarMudanca(cod, novaMudanca);
        }

        public void excluirMudanca(int cod) {
            mudancas.excluirMudanca(cod);
        }

        //Métodos Ocorrências
        public void inserirOcorrencia(Ocorrencia oco) {
            ocorrencias.inserirOcorrencia(oco);
        }

        public Ocorrencia buscarOcorrencia(int cod) {
            Ocorrencia oco = new Ocorrencia();
            oco = ocorrencias.buscarOcorrencia(cod);
            return oco;
        }

        public void alterarOcorrencia(int cod, Ocorrencia novaOcorrencia) {
            ocorrencias.alterarOcorrencia(cod, novaOcorrencia);
        }

        public void cancelarOcorrencia(int cod, String descricao) {
            ocorrencias.cancelarOcorrencia(cod, descricao);
        }

        public int buscarCodigoOcorrencia() {
            return ocorrencias.buscarCodigoOcorrencia();
        }

        public void vincularFiscal(int cod, string nome) {
            ocorrencias.vincularFiscal(cod, nome);
        }

        public void mudarSituacaoOcorrencia(string newSituacao, int cod) {
            ocorrencias.mudarSituacao(newSituacao, cod);
        }

        public ArrayList gerarRelatorioOcorrencia(int codigo_busca, DateTime data1, DateTime data2, string bairro, string denunciante)
        {
            return ocorrencias.gerarRelatorio(codigo_busca, data1, data2, bairro, denunciante);
        }

        //Métodos Pedidos
        public void inserirPedido(Pedido ped) {
            pedidos.inserirPedido(ped);
        }

        public Pedido buscarPedido(int cod) {
            Pedido ped = new Pedido();
            ped = pedidos.buscarPedido(cod);
            return ped;
        }

        public void alterarPedido(int cod, Pedido novoPedido) {
            pedidos.alterarPedido(cod, novoPedido);
        }

        public void excluirPedido(int cod) {
            pedidos.excluirPedido(cod);
        }

        public bool validarPedido(int cod_ocorrencia) {
            return pedidos.validarPedido(cod_ocorrencia);
        }

        public int pedidoDaOcorrencia(int ocorrencia_cod) {
            return pedidos.pedidoDaOcorrencia(ocorrencia_cod);
        }

        public int buscarCodigoPedido() {
            return pedidos.buscarCodigoPedido();
        }

        public void mudarSituacaoPedido(string newSituacao, int cod)
        {
            pedidos.mudarSituacao(newSituacao, cod);
        }

        //Métodos Propostas
        public void inserirProposta(Proposta pro) {
            propostas.inserirProposta(pro);
        }

        public Proposta buscarProposta(int cod) {
            Proposta pro = new Proposta();
            pro = propostas.buscarProposta(cod);
            return pro;
        }

        public void alterarProposta(int cod, Proposta novaProposta) {
            propostas.alterarProposta(cod, novaProposta);
        }

        public void excluirProposta(int cod) {
            propostas.excluirProposta(cod);
        }

        public ArrayList propostasDoPedido(int pedido_codigo) {
            return propostas.propostasDoPedido(pedido_codigo);
        }

        public void mudarSituacaoProposta(string newSituacao, int cod)
        {
            propostas.mudarSituacao(newSituacao, cod);
        }

        public void aceitarProposta(int codigo_proposta, int codigo_pedido)
        {
            propostas.aceitarProposta(codigo_proposta, codigo_pedido);
        }

        //Métodos Terceiros
        public void inserirTerceiro(Terceiro ter) {
            terceiros.inserirTerceiro(ter);
        }

        public Terceiro buscarTerceiro(int cod) {
            Terceiro ter = new Terceiro();
            ter = terceiros.buscarTerceiro(cod);
            return ter;
        }

        public void alterarTerceiro(int cod, Terceiro novoTerceiro) {
            terceiros.alterarTerceiro(cod, novoTerceiro);
        }

        public void excluirTerceiro(int cod) {
            terceiros.excluirTerceiro(cod);
        }

        public int buscarCodigoTerceiro() {
            return terceiros.buscarCodigoTerceiro();
        }

        public Terceiro logarTerceiro(int cod, string cnpj) {
            return terceiros.logarTerceiro(cod, cnpj);
        }

        public bool validaCnpj(string cnpj) {
            return terceiros.validaCnpj(cnpj);
        }

        //Métodos Usuários
        public void inserirUsuario(Usuario usu) {
            usuarios.inserirUsuario(usu);
        }

        public Usuario buscarUsuario(string login) {
            Usuario usu = new Usuario();
            usu = usuarios.buscarUsuario(login);
            return usu;
        }

        public void alterarUsuario(string login, Usuario novoUsuario) {
            usuarios.alterarUsuario(login, novoUsuario);
        }

        public void excluirUsuario(string login) {
            usuarios.excluirUsuario(login);
        }

        public Usuario logarUsuario(string login, string senha) {
            Usuario usu = usuarios.logarUsuario(login, senha);

            if (usu != null) {
                this.Usuario = usu;
            } else {
                this.usuario = null;
            }

            return usu;
        }

        public int registrarLogonUsuario(Usuario usu, DateTime data)
        {
            return usuarios.registrarLogonUsuario(usu, data);
        }

        public void registrarLogoffUsuario(DateTime data, int cod)
        {
            usuarios.registrarLogoffUsuario(data, cod);
        }
    }
}
